package org.baicaixiaozhan.learncommon.config.gson;

import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import java.lang.reflect.Type;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * {@link LocalTime} Json 格式 {@code HH:mm:ss} 格式化 默认实现<p />
 * 如须实现 {@link LocalTime} 其他模式的格式化，可直接继承本类，覆写 {@link DefaultLocalTimeSerializer#format()} 即可。
 *
 * @see DefaultLocalDateSerializer
 * @see DefaultLocalDateTimeSerializer
 * @since 2021/4/1
 * @author baicaixiaozhan
 */
public class DefaultLocalTimeSerializer extends AbstractDatetimeFormatter implements JsonSerializer<LocalTime> {

    private static final String PATTERN = "HH:mm:ss";

    /**
     * Gson invokes this call-back method during serialization when it encounters a field of the
     * specified type.
     *
     * <p>In the implementation of this call-back method, you should consider invoking
     * {@link JsonSerializationContext#serialize(Object, Type)} method to create JsonElements for any
     * non-trivial field of the {@code src} object. However, you should never invoke it on the
     * {@code src} object itself since that will cause an infinite loop (Gson will call your
     * call-back method again).</p>
     *
     * @param src       the object that needs to be converted to Json.
     * @param typeOfSrc the actual type (fully genericized version) of the source object.
     * @param context
     * @return a JsonElement corresponding to the specified object.
     */
    @Override
    public JsonElement serialize(LocalTime src, Type typeOfSrc, JsonSerializationContext context) {
        return context.serialize(src.format(format()));
    }

    /**
     * 返回对应时间格式
     *
     * @return
     */
    @Override
    protected DateTimeFormatter format() {
        return DateTimeFormatter.ofPattern(PATTERN);
    }
}
